from pymongo import MongoClient
import pymongo


class Mongo(object):

    def __init__(self, host, port, db):
        """
        :param host: 主机
        :param port: 端口
        :param db:  数据库
        """
        self.client = MongoClient(host, port)
        self.db = self.client[db]

    def insert_one(self, collection, document):
        """
        添加一条数据
        :param collection: 集合
        :param document: 文章
        :return: 文档在集合中的id
        """
        coll = self.db[collection]
        result = coll.insert_one(document)
        return result.inserted_id

    def insert_many(self, collection, documents):
        """
        添加多条数据
        :param collection: 集合
        :param documents: 多条数据
        :return: id列表
        """
        coll = self.db[collection]
        result = coll.insert_many(documents)
        return list(map(lambda x: str(x), result.inserted_ids))

    def find_one(self, collection, query):
        """
        查询一条数据
        :param collection: 集合
        :param query: 查询条件
        :return: 数据
        """

        coll = self.db[collection]
        return coll.find_one(query)


    def find_many(self, collection, query):
        """
        查询多条数据
        :param collection: 集合
        :param query: 查询条件
        :return: 数据集
        """
        coll = self.db[collection]
        return list(coll.find(query))


    def find(self, collection):
        """
        获取所有数据
        :param collection:集合
        :return: 数据集
        """
        coll = self.db[collection]
        return list(coll.find())

mongo = Mongo("127.0.0.1", 27017, "blog")
it_data2={
    "title": "一次彻底讲清如何处理mysql 的死锁问题",
    "author": "friendship",
    "publish_time": "2024-10-17 15:43",
    "tags": ["science", "business", "tech"],
    "comments": [
        {"content": "文章写的不错", "commenter": "铁柱", "comment_time": "2024-10-17 15:43"},
        {"content": "分析的很到位", "commenter": "铁柱", "comment_time": "2024-10-17 15:43"},
        {"content": "文章很nice", "commenter": "铁柱", "comment_time": "2024-10-17 15:43"},
    ]
}
# 添加一条数据
# res = mongo.insert_one("it_blog", it_data2)

# 添加多条数据
datas = [
    {
        "title": "一次彻底讲清如何处理mysql 的死锁问题",
        "author": "friendship",
        "publish_time": "2024-10-17 15:43",
        "description": "MySQL 死锁 是指两个或多个事务互相等待对方持有的锁，从而导致所有事务都无法继续执行的现象。在 InnoDB 存储引擎中，死锁是通过锁机制产生的，特别是在并发较高、业务逻辑复杂的情况下，更容易发生死锁。",
        "content": "MySQL 死锁是数据库在并发场景下常见的问题，特别是对于大规模、复杂的业务系统，死锁问题更为频繁。通过合理的索引设计、保持加锁顺序一致、缩短事务时间、优化锁策略等手段，可以有效减少死锁的发生。同时，当死锁发生时，MySQL 具备死锁检测和自动回滚机制，开发人员可以通过合理的异常处理和重试机制，来提高系统的稳定性和可靠性。秋是慢入的，但冷却是突然的，晴不知夏去，一雨方觉秋深！上海有点冷了。",
        "views": "100000",
        "likes": 20000
    },
{
        "title": "mongodb 拥有十大核心优势，为何国内知名度不是很高？",
        "author": "friendship",
        "publish_time": "2024-10-17 15:43",
        "description": "mongodb 是一款功能完善的分布式文档数据库，在高性能、动态扩缩容、高可用、易部署、易使用、海量数据存储、高压缩比等方面拥有天然优势",
        "content": "当前开源数据库 Mysql，当同一个分片复制集中(假设一主两从)中的主服务器异常或者实例异常退出后，需要依赖第三方 MHA 插件来实现新主的选举。如果没有第三方 MHA 插件，或者第三方 MHA 插件异常，则无法选举新主节点，最终造成写失败。相比 Mysql 对第三方 MHA 插件的依赖，mongodb 数据库自带天然高可用选举功能，具体架构图如下:",
        "views": "100000",
        "likes": 20000
    },

]

# 添加多条数据
# res = mongo.insert_many("it_blog", datas)
# print(res)

"""
查询：
范围来查询：
小于：$lt
小于等于：$lte
大于：$gt
大于等于：$gte
不等于： $ne
在范围之内：$in
不在范围之内：$nin
"""
# query = {"likes":{"$gte": 20000}}
#
# res = mongo.find_one("it_blog", query)
# print(res)

"""
模糊查询：
在MongoDB中使用正则表达式来实现
查询标题中包含mysql的记录
"""
query = {
    "title": {"$regex": "mysql"}
}
# res = mongo.find_one("it_blog", query)
# res = mongo.find_many("it_blog", query)
# print(res, len(res))


# 获取所有数据
# res = mongo.find("it_blog")
# print(res, len(res))

# 计数
db = mongo.db
count = db["it_blog"].estimated_document_count()  # 统计总数
# print(count)
# 根据条件来统计数量
# count = db["it_blog"].count_documents(query)
# print(count)

# 排序
# res = db["it_blog"].find(query).sort("views", pymongo.DESCENDING)  # 降序
# print(list(res))

# 限定返回的记录数
res = list(db["it_blog"].find(query).limit(5))
print(res, len(res))